iT邦幫忙

2021 iThome 鐵人賽

DAY 20
1
Modern Web

初學者跪著學JavaScript系列 第 20

初學者跪著學JavaScript Day20 : 原型畢露(中)

  • 分享至 

  • xImage
  •  

一日客語:中文:青色 客語:搶厶ㄟ ˋ

繼續學習原型吧~
學習內容:
1.Object.getPrototypeOf() =>等於__proto__[[prototype]]
2.Object.getPrototypeOf(實例).constructor
3.利用Object.getPrototypeOf(實例).constructor 方式建立物件
4.改掉原型


現在創了一個 constructor Cat 然後new 出一個實例 nini,可以透過
Object.getPrototypeOf()語法去查找到,除了定義的 sleep 屬性以外還有一個內建屬性叫 constructor指向 Cat 所以
Object.getPrototypeOf(nini).constructor才能印出Cat


function Cat() {
    this.eat = () => 'apple';
}

const nini = new Cat();
Cat.prototype.sleep = 'sleep';

console.log(nini);
//Cat { eat: [Function (anonymous)] }

console.log(Object.getPrototypeOf(nini));
//{sleep: 'sleep', constructor: Cat}

console.log(Object.getPrototypeOf(nini).constructor); //[Function: Cat]

自訂物件改掉原型

若是把 Cat 的原型重新賦值新的物件,原本已經創建的nini還取得到 sleep 嗎
新創的 niki 取得到 sleep 嗎?

繼續看下去吧

function Cat() {
    this.eat = () => 'apple';
}

const nini = new Cat();
Cat.prototype.sleep = 'sleep';
console.log(Object.getPrototypeOf(nini)); //{ sleep: 'sleep' }

//原型變動
//新物件改掉Cat原型
Cat.prototype = {
    go: function () {
        return 'go';
    },
};

const niki = new Cat();

console.log(Object.getPrototypeOf(niki)); //{ go: [Function: go] }
Object.getPrototypeOf(niki).constructor//Object

答案:新物件改掉 Cat 原型,nini 仍然可以使用 sleep 方法但 niki 參照的原型已經改變所以無法取用 sleep 屬性

console.log(nini.sleep);//sleep
console.log(niki.go()); //go
console.log(niki.sleep); //undefined

用圖型看看

新物件(niki)會參照到新原型
在原型變動之前創造出來的物件(nini)仍然可以參照到那時的原型

下集預告

修改了Cat原型後使用Object.getPrototypeOf(niki).constructor
為何是印出 Object 呢
一開始 Object.getPrototypeOf(nini).constructor 明明是Cat為何原型有這種差異呢~~
難道原型鏈結構產生變化?!明天讓我用instanceof來解釋這些關係

function Cat() {
    this.eat = () => 'apple';
}

const nini = new Cat();
Cat.prototype.sleep = 'sleep';
console.log(Object.getPrototypeOf(nini)); //{ sleep: 'sleep' }

//原型變動
//新物件改掉Cat原型
Cat.prototype = {
    go: function () {
        return 'go';
    },
};

const niki = new Cat();

console.log(Object.getPrototypeOf(niki)); //{ go: [Function: go] }
Object.getPrototypeOf(niki).constructor//Object

資料參考:
忍者開發技巧探秘第二版


上一篇
初學者跪著學JavaScript Day19 : 原型畢露(上)
下一篇
初學者跪著學JavaScript Day21 : 原型畢露(下)
系列文
初學者跪著學JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言